package AbstractFactory

import (
	"fmt"
	"net/http"
	"net/http/httptest"
)

//抽象工厂：抽象工厂返回的是接口而不是结构体
//通过返回的接口 可以在你不公开内部实现的情况下，让调用者使用你提供的各种功能

//
// Person
// @Description: 结构体
//
type person struct {
	name string
	age  int
}

//
// IPerson
// @Description:接口
//
type IPerson interface {
	Greet()
}

// Greet
// @author: lhg
// @Date: 2021-08-11 13:21:34
// @Description:
// @receiver p
//
func (p person) Greet() {
	fmt.Printf("Hi.My name is %s,%d years old", p.name, p.age)
}

// NewPerson
// @author: lhg
// @Date: 2021-08-11 13:22:57
// @Description: 抽象工厂返回接口(因为person结构体实现了IPerson接口)
// @param name string
// @param age int
// @return IPerson
//
func NewPerson(name string, age int) IPerson {
	return person{
		name: name,
		age:  age,
	}
}

/********实现多个工厂函数，来返回不同的接口实现***************************************************/

//
// Doer
// @Description:
//
type Doer interface {
	// Do
	// @Description:
	// @param req
	// @return *http.Response
	// @return error
	//
	Do(req *http.Request) (*http.Response, error)
}

//
// mockHttpClient
// @Description:
//
type mockHttpClient struct{}

// NewHttpClient
// @author: lhg
// @Date: 2021-08-11 13:34:08
// @Description:
// @return Doer
//
func NewHttpClient() Doer {
	return &http.Client{}
}

// Do
// @author: lhg
// @Date: 2021-08-11 13:36:24
// @Description:
// @receiver receiver
// @param req *http.Request
// @return *http.Response
// @return error
//
func (receiver *mockHttpClient) Do(req *http.Request) (*http.Response, error) {
	res := httptest.NewRecorder()
	return res.Result(), nil
}

// NewMockHttpClient
// @author: lhg
// @Date: 2021-08-11 13:37:58
// @Description:
// @return Doer
//
func NewMockHttpClient() Doer {
	return &mockHttpClient{}
}
